import pandas as pd
import numpy as np
from pathlib import Path
from datetime import datetime

def calculate_meeting_days(row):
    """计算会议天数：结束时间 - 开始时间 + 1"""
    try:
        start_date = pd.to_datetime(row['开始时间'])
        end_date = pd.to_datetime(row['结束时间'])
        if pd.isna(start_date) or pd.isna(end_date):
            return None
        days = (end_date - start_date).days + 1
        return days if days > 0 else None
    except Exception:
        return None

def calculate_worker_percentage(row):
    """计算工作人员占比：工作人员人数 / 会议代表人数 x 100%"""
    try:
        if pd.isna(row['工作人员人数']) or pd.isna(row['会议代表人数']) or row['会议代表人数'] == 0:
            return None
        return (row['工作人员人数'] / row['会议代表人数']) * 100
    except Exception:
        return None

def calculate_cost_per_person_per_day(row):
    """计算实际每人每天会议费：会议费小计 / 会议代表人数  / 会议天数"""
    try:
        # total_people = row['会议代表人数'] + row['工作人员人数']
        total_people = row['会议代表人数']
        if (pd.isna(row['会议费合计']) or pd.isna(total_people) or 
            total_people == 0 or pd.isna(row['会议天数']) or 
            row['会议天数'] == 0):
            return None
        return row['会议费合计'] / total_people / row['会议天数']
    except Exception:
        return None

def check_exceeding_standards(row, standards_dict):
    """检查各项是否超标"""
    try:
        meeting_type = row['会议类别']
        if pd.isna(meeting_type) or meeting_type not in standards_dict:
            return pd.Series({
                '天数是否超标': '数据异常',
                '工作人员占比是否超标': '数据异常',
                '费用是否超标': '数据异常'
            })
            
        standard = standards_dict[meeting_type]
        
        # 检查会议天数是否超标
        days_exceeded = '是' if row['会议天数'] > standard['会议最大天数'] else '否'
            
        # 检查工作人员占比是否超标
        workers_exceeded = '是' if row['工作人员数占会议代表人数百分比'] > standard['最大工作人员占比'] else '否'
            
        # 检查会议费是否超标
        cost_exceeded = '是' if row['实际每人每天会议费金额'] > standard['会议费标准'] else '否'
            
        return pd.Series({
            '天数是否超标': days_exceeded,
            '工作人员占比是否超标': workers_exceeded,
            '费用是否超标': cost_exceeded
        })
        
    except Exception:
        return pd.Series({
            '天数是否超标': '数据异常',
            '工作人员占比是否超标': '数据异常',
            '费用是否超标': '数据异常'
        })

def analyze_conferences(once = False):
    """分析会议数据"""
    try:
        # 设置数据文件路径
        data_dir = Path("data")
        alldata_dir = data_dir / "alldata"
        alldata_dir.mkdir(parents=True, exist_ok=True)
        
        # 读取源数据
        print("正在读取会议数据...")
        conferences_df = pd.read_excel(data_dir / "主办会议基本信息模板表.xlsx")
        standards_df = pd.read_excel(data_dir / "会议标准信息表.xlsx")
        
        # 打印数据形状
        print(f"会议基本信息记录数: {len(conferences_df)}")
        print(f"会议标准信息记录数: {len(standards_df)}")
        
        # 清理列名中的空格
        conferences_df.columns = conferences_df.columns.str.strip()
        standards_df.columns = standards_df.columns.str.strip()
        
        # 创建会议标准字典
        standards_dict = {
            '一类会议': {'会议费标准': 240, '会议最大天数': 2, '最大工作人员占比': 10},
            '二类会议': {'会议费标准': 220, '会议最大天数': 1, '最大工作人员占比': 10},
            '三类会议': {'会议费标准': 200, '会议最大天数': 1, '最大工作人员占比': 10}
        }
        
        # 计算关键指标
        print("\n计算关键指标...")
        
        # 1. 计算会议天数
        # conferences_df['会议天数'] = conferences_df.apply(calculate_meeting_days, axis=1)
        
        # 2. 计算工作人员占比
        conferences_df['工作人员数占会议代表人数百分比'] = conferences_df.apply(calculate_worker_percentage, axis=1)
        
        # 3. 计算每人每天会议费
        conferences_df['实际每人每天会议费金额'] = conferences_df.apply(calculate_cost_per_person_per_day, axis=1)
        
        # 4. 检查各项是否超标
        exceeding_results = conferences_df.apply(lambda row: check_exceeding_standards(row, standards_dict), axis=1)
        conferences_df = pd.concat([conferences_df, exceeding_results], axis=1)
        conferences_df['工作人员数占会议代表人数百分比'] = conferences_df['工作人员数占会议代表人数百分比'].apply(lambda x: f"{x:.0f}%" if pd.notna(x) else x)
        # 分别筛选三种超标情况
        staff_exceeding_df = conferences_df[conferences_df['工作人员占比是否超标'] == '是'].copy()
        days_exceeding_df = conferences_df[conferences_df['天数是否超标'] == '是'].copy()
        cost_exceeding_df = conferences_df[conferences_df['费用是否超标'] == '是'].copy()
        
        # 格式化日期列为年月日格式
        # date_columns = ['开始时间', '结束时间']
        # for df in [staff_exceeding_df, days_exceeding_df, cost_exceeding_df]:
        #     for col in date_columns:
        #         df[col] = pd.to_datetime(df[col]).dt.strftime('%Y-%m-%d')

        if once:
            return staff_exceeding_df, days_exceeding_df, cost_exceeding_df

        # 保存三个分析结果
        staff_output_file = alldata_dir / "主办会议人数超标分析结果.xlsx"
        days_output_file = alldata_dir / "主办会议天数超标分析结果.xlsx"
        cost_output_file = alldata_dir / "主办会议金额超标分析结果.xlsx"
        
        staff_exceeding_df.to_excel(staff_output_file, index=False)
        days_exceeding_df.to_excel(days_output_file, index=False)
        cost_exceeding_df.to_excel(cost_output_file, index=False)
        
        print(f"\n分析完成！")
        print(f"人数超标记录数: {len(staff_exceeding_df)}")
        print(f"天数超标记录数: {len(days_exceeding_df)}")
        print(f"金额超标记录数: {len(cost_exceeding_df)}")
        print(f"\n结果已保存到:")
        print(f"1. '{staff_output_file}'")
        print(f"2. '{days_output_file}'")
        print(f"3. '{cost_output_file}'")
        
        return True
        
    except Exception as e:
        print(f"处理过程中出现错误: {str(e)}")
        return False

if __name__ == "__main__":
    analyze_conferences()